home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / dshell / dsh333bs.lzh / meswin.c < prev    next >
C/C++ Source or Header  |  1999-07-11  |  4KB  |  282 lines

  1. /*
  2.     dshell    v3
  3.  
  4.     メッセージ窓表示関係
  5. */
  6.  
  7. #include    "dsh.h"
  8.  
  9. #define    KAGE    FALSE
  10.  
  11. static void win_frame2(int , int , int , int , int , int );
  12.  
  13.  
  14. /*
  15.     中央のウィンドウを開く
  16.     影付きバージョン
  17. */
  18. void 
  19. w_open()
  20. {
  21.     int sx = GMODE ? 10 : 26;
  22.  
  23.     B_COLOR(5);
  24.     vsync();
  25. #if KAGE
  26.     tbox_w2(sx, 14, sx + 46, 20);
  27. #endif
  28.     tbox_w2(sx - 1, 13, (sx - 1) + 46, 19);
  29.     tbox_w2(sx - 1, 13, (sx - 1) + 46, 14);
  30.  
  31.     B_COLOR(7);
  32.     B_LOCATE(sx + ((46 - strlen(Sysmes2)) / 2), 13);
  33.     B_PRINT(Sysmes2);
  34.     B_COLOR(3);
  35. }
  36.  
  37. /*
  38.     枠の太さが2のボックスをつくる
  39. */
  40. void 
  41. tbox_w2(int sx, int sy, int ex, int ey)
  42. {
  43.     struct TBOXPTR win;    /* サイズ割りあてが同じなので使いまわしが効く */
  44.  
  45.     sx = sx * 8 - 4;
  46.     ex = ex * 8 + 4;
  47.     sy = sy * 16 - 8;
  48.     ey = ey * 16 + 8;
  49.  
  50.     win.vram_page = 0;
  51.     win.x = sx;
  52.     win.y = sy;
  53.     win.x1 = ex - sx + 1;
  54.     win.y1 = ey - sy + 1;
  55.     win.line_style = 0xffff;
  56.     TXBOX(&win);
  57.  
  58.     win.vram_page = 1;
  59.     win.line_style = 0x0000;
  60.     TXBOX(&win);
  61.  
  62.  
  63.     win.vram_page = 0;
  64.     win.x++;
  65.     win.y++;
  66.     win.x1 -= 2;
  67.     win.y1 -= 2;
  68.     win.line_style = 0xffff;
  69.     TXBOX(&win);
  70.  
  71.     win.vram_page = 1;
  72.     win.line_style = 0x0000;
  73.     TXBOX(&win);
  74.  
  75.  
  76.     win.vram_page = 0;
  77.     win.x++;
  78.     win.y++;
  79.     win.x1 -= 2;
  80.     win.y1 -= 2;
  81.     win.line_style = 0x0000;
  82.     TXFILL((struct TXFILLPTR *)&win);
  83.  
  84.     win.vram_page = 1;
  85.     TXFILL((struct TXFILLPTR *)&win);
  86. }
  87.  
  88. void 
  89. w_close()
  90. {
  91.     int i, n = lp + 11;
  92.  
  93.     for (i = 32; i < 32 + 8; i++)
  94.         p_lin(n++, i);
  95.     vsync();
  96.     TXRASCPY(0x8430, 4*8, 3);
  97. }
  98.  
  99.  
  100. /*
  101.     ウィンドウの中にメッセージを書く
  102. */
  103. void 
  104. w_mes(int l, const char *mes)
  105. {
  106.     int dx, n;
  107.  
  108.     dx = (GMODE) ? 0 : 16;
  109.     l = (l + 15) * 16 / 4;
  110.     TXRASCPY((l << 8) + 0x80, 4, 3);
  111.     n = strlen(mes);
  112.     if (n < 44)
  113.         B_PUTMES(3, 10 + dx, 32, 44 - 1, "");
  114.     B_PUTMES(7, 32 + dx - n / 2, 32, n - 1, mes);
  115.     TXRASCPY((0x80 << 8) + l, 4, 3);
  116. }
  117.  
  118. /*
  119.     ウィンドウを開いてマウスが押されるのを待つ
  120.  
  121.     wtime/100 秒だけ待って戻る(0の時は押されるまで待ち続ける)
  122. */
  123. void 
  124. w_wait(int wtime)
  125. {
  126.     int dmx, dmy, bl, br, et;
  127.  
  128.     if (debugMode && wtime >= 100 && codein_on())
  129.         wtime = 0;
  130.     if (wtime) {
  131.         et = init_et(wtime);
  132.     } else {
  133.         et = INT_MAX;
  134.     }
  135.     if (!(GMODE)) {
  136.         B_LOCATE(28, 16);
  137.     } else {
  138.         B_LOCATE(10, 16);
  139.     }
  140.     if (wtime == 0) {        /* メッセージが出なくてもクリックすれば戻るっす */
  141.         B_COLOR(5);
  142.         B_PRINT("☆ マウスを『クリック』してください ☆");
  143.         B_COLOR(3);
  144.     }
  145.     if (wtime <= 20 && wtime > 0) {
  146.         while (et > d_ontime())
  147.             ;
  148.     } else {
  149.         wait_mb_off();
  150.         do {
  151.             p_time(0);
  152.             dmsstat(&dmx, &dmy, &bl, &br);
  153.         } while (!bl && !br && (et > d_ontime()));
  154.         wait_mb_off();
  155.     }
  156. }
  157.  
  158.  
  159.  
  160. /*
  161.     左上(x0,y0)右下(x1,y1)のフレームを描く。
  162.     ku指定 : y=kuの行に横細罫を加える
  163.     ex指定 : 下バーメニューから足を生やす(始点x=exから半角4つ分の幅)
  164. */
  165. void 
  166. win_frame(int x0, int y0, int x1, int y1, int ku, int ex)
  167. {
  168.     int i;
  169.  
  170.     win_frame2(x0, y0, x1, 1, 2, 3);
  171.  
  172.     for (i = y0 + 1; i < y1; i++) {
  173.         win_frame2(x0, i, x1, 6, 0, 6);
  174.     }
  175.  
  176.     win_frame2(x0, y1, x1, 4, 2, 5);
  177.  
  178.     if (ku) {
  179.         win_frame2(x0, ku, x1, 7, 8, 9);
  180.     }
  181.     if (ex) {
  182.         win_frame2(ex, y1, ex + 4, 3, 0, 1);
  183.     }
  184. }
  185.  
  186. /*
  187.     (x0,y0) - (x1,y0)を、
  188.     左端cl、中cm、右端crのパターンで描く(フレーム)
  189. */
  190. static void 
  191. win_frame2(int x0, int y0, int x1, int cl, int cm, int cr)
  192. {
  193.     static const char *frame[]=
  194.     {
  195.         " ",
  196.         "┏", "━", "┓",
  197.         "┗", "┛", "┃",
  198.         "┠", "─", "┨"
  199.     };
  200.     int i;
  201.  
  202.     B_LOCATE(x0, y0);
  203.     B_PRINT(frame[cl]);
  204.     for (i = x0 + 2; i < x1; i += 2) {
  205.         B_PRINT(frame[cm]);
  206.     }
  207.     B_PRINT(frame[cr]);
  208. }
  209.  
  210.  
  211. void 
  212. w_copy()
  213. {
  214.     w_mes(0, "ファイルのコピー中です");
  215.     w_mes(1, "しばらくお待ち下さい");
  216. }
  217.  
  218. void 
  219. w_load()
  220. {
  221.     w_mes(0, "ファイルの読み込み中です");
  222.     w_mes(1, "しばらくお待ち下さい");
  223. }
  224.  
  225.  
  226.  
  227.  
  228. void 
  229. dabort(const char *mes)
  230. {
  231.     w_open();
  232.     B_COLOR(GMODE ? 7 : 6);
  233.     B_LOCATE((GMODE ? 32 : 48) - strlen(mes) / 2, 13);
  234.     B_PRINT(mes);
  235.     w_mes(0, "処理を中止します");
  236.     w_wait(0);
  237.     w_close();
  238. }
  239.  
  240.  
  241. void 
  242. d_mem()
  243. {
  244.     dabort("メモリー不足です");
  245. }
  246.  
  247. void 
  248. d_read()
  249. {
  250.     dabort("『ファイルリードエラー』が発生しました");
  251. }
  252.  
  253. void 
  254. d_write()
  255. {
  256.     dabort("『ファイルライトエラー』が発生しました");
  257. }
  258.  
  259. void
  260. d_heap(void)
  261. {
  262.     dabort("ヒープを使い切りました");
  263. }
  264.  
  265.  
  266.  
  267.  
  268. /*
  269.     復帰するとアブないエラー
  270. */
  271. volatile void
  272. d_mfree()
  273. {
  274.     w_open();
  275.     w_mes(0, "メモリブロックの解放に失敗しました");
  276.     w_mes(2, "とりあえず終了します");
  277.     w_wait(0);
  278.  
  279.     dsh_abort(1);
  280. }
  281.  
  282.